/**
 * ControladoraBDResponsable.java
 */

 /**
 *  AdSec: Administrador de Secundarias
 *  Copyright (C) 2009 Daniela Ramírez Chaves (dannyrch@gmail.com)
 *  Copyright (C) 2009 Leonel Salazar Valverde (leo87sv@gmail.com)
 *
 *  This file is part of AdSec.
 *  AdSec is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  AdSec is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with AdSec.  If not, see <http://www.gnu.org/licenses/>.
 */

package adsec.datos;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.util.LinkedList;
import adsec.entidades.Responsable;


public class ControladoraBDResponsable {

    private Connection conexion;
    private AdministradorConexion adminConexion;
    
    public ControladoraBDResponsable(){
        adminConexion = AdministradorConexion.getInstancia();
    }

    public Responsable consultarResponsable(String cedula){
        Responsable responsable = null;
        conexion = adminConexion.getConexion();
        if(conexion != null){
            CallableStatement procedimiento = this.spConsultarResponsable(conexion, cedula);
            if(procedimiento != null){
                try{
                    procedimiento.execute();
                    ResultSet resultado = procedimiento.getResultSet();
                    if(resultado.next())
                        responsable = this.crearResponsable(resultado);
                }catch(SQLException e){
                    e.printStackTrace();
                }//fin de try catch
            }//fin de if
        }//fin de if
        adminConexion.cerrarConexion();
        return responsable;
    }//fin de consultarEstudiante

    public LinkedList<Responsable> consultarResponsables(String cedulaEstudiante){
        LinkedList<Responsable> lista = new LinkedList<Responsable>();
        conexion = adminConexion.getConexion();
        if(conexion != null){
            CallableStatement procedimiento = this.spConsultarResponsables(conexion, cedulaEstudiante);
            if(procedimiento != null){
                try{
                    procedimiento.execute();
                    ResultSet resultado = procedimiento.getResultSet();
                    while(resultado.next()){
                        Responsable responsable = this.crearResponsableLight(resultado);
                        lista.add(responsable);
                    }//fin de while
                }catch(SQLException e){
                    e.printStackTrace();
                }//fin de try catch
            }//fin de if
        }//fin de if
        adminConexion.cerrarConexion();
        return lista;
    }//fin de consultarResponsables

    public int insertarResponsable(Responsable responsable){
        int resultado = AdministradorConexion.QUERY_ERROR;
        conexion = adminConexion.getConexion();
        if(conexion != null){
            CallableStatement procedimiento = this.spInsertarResponsable(conexion, responsable);
            if(procedimiento != null){
                try{
                    procedimiento.execute();
                    resultado = AdministradorConexion.QUERY_OK;
                }catch(SQLException e){
                    e.printStackTrace();
                }//fin de try catch
            }//fin de if
        }//fin de if
        adminConexion.cerrarConexion();
        return resultado;
    }//fin de insertarResponsable

    public int insertarRelacionEstudianteResponsable(String responsable, String estudiante){
        int resultado = AdministradorConexion.QUERY_ERROR;
        conexion = adminConexion.getConexion();
        if(conexion != null){
            CallableStatement procedimiento = this.spInsertarRelacionEstudianteResponsable(conexion, responsable, estudiante);
            if(procedimiento != null){
                try{
                    procedimiento.execute();
                    resultado = AdministradorConexion.QUERY_OK;
                }catch(SQLException e){
                    e.printStackTrace();
                }//fin de try catch
            }//fin de if
        }//fin de if
        adminConexion.cerrarConexion();
        return resultado;
    }

    public int modificarResponsable(Responsable responsable){
        int resultado = AdministradorConexion.QUERY_ERROR;
        conexion = adminConexion.getConexion();
        if(conexion != null){
            CallableStatement procedimiento = this.spModificarResponsable(conexion, responsable);
            if(procedimiento != null){
                try{
                    procedimiento.execute();
                    resultado = AdministradorConexion.QUERY_OK;
                }catch(SQLException e){
                    e.printStackTrace();
                }//fin de try catch
            }//fin de if
        }//fin de if
        adminConexion.cerrarConexion();
        return resultado;
    }//fin de modificarResponsable

    public int eliminarResponsable(String cedula){
        int resultado = AdministradorConexion.QUERY_ERROR;
        conexion = adminConexion.getConexion();
        if(conexion != null){
            CallableStatement procedimiento = this.spEliminarResponsable(conexion, cedula);
            if(procedimiento != null){
                try{
                    procedimiento.execute();
                    resultado = AdministradorConexion.QUERY_OK;
                }catch(SQLException e){
                    e.printStackTrace();
                }//fin de try catch
            }//fin de if
        }//fin de if
        adminConexion.cerrarConexion();
        return resultado;
    }//fin de eliminarResponsable

    private CallableStatement spConsultarResponsable(Connection conexion, String cedula){
        CallableStatement procedimiento = null;
        try{
            procedimiento = conexion.prepareCall("CALL consultarResponsable" + UtilidadesCapaDatos.agregarParametros(1),
                ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            procedimiento.setString(Responsable.cedulaNC+"_p", cedula);
        }catch(SQLException sqlException){
            sqlException.printStackTrace();
        }
        return procedimiento;
    }//fin de spConsultarResponsable
    
    private CallableStatement spConsultarResponsables(Connection conexion, String cedulaEstudiante){
        CallableStatement procedimiento = null;
        try{
            procedimiento = conexion.prepareCall("CALL consultarResponsables" + UtilidadesCapaDatos.agregarParametros(1),
                ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            procedimiento.setString(Responsable.cedulaEstudianteNC+"_p", cedulaEstudiante);
        }catch(SQLException sqlException){
            sqlException.printStackTrace();
        }
        return procedimiento;
    }//fin de spConsultarResponsables
    
    private CallableStatement spInsertarResponsable(Connection conexion, Responsable responsable){
        CallableStatement procedimiento = null;
        try{
            procedimiento = conexion.prepareCall("CALL insertarResponsable" + UtilidadesCapaDatos.agregarParametros(12),
                ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            procedimiento.setString(Responsable.cedulaNC+"_p", responsable.getCedula());
            procedimiento.setString(Responsable.nombreNC+"_p", responsable.getNombre());
            procedimiento.setString(Responsable.apellidosNC+"_p", responsable.getApellidos());
            procedimiento.setDate(Responsable.fechaNacNC+"_p", responsable.getFechaNac());
            procedimiento.setString(Responsable.telefono1NC+"_p", responsable.getTelefono1());
            procedimiento.setString(Responsable.telefono2NC+"_p", responsable.getTelefono2());
            procedimiento.setString(Responsable.sexoNC+"_p", responsable.getSexo());
            procedimiento.setString(Responsable.nacionalidadNC+"_p", responsable.getNacionalidad());
            procedimiento.setString(Responsable.provinciaNC+"_p", responsable.getProvincia());
            procedimiento.setString(Responsable.cantonNC+"_p", responsable.getCanton());
            procedimiento.setString(Responsable.distritoNC+"_p", responsable.getDistrito());
            procedimiento.setString(Responsable.otrasSeniasNC+"_p", responsable.getOtrasSenias());
        }catch(SQLException sqlException){
            sqlException.printStackTrace();
        }
        return procedimiento;
    }//fin de spInsertarResponsable

    private CallableStatement spInsertarRelacionEstudianteResponsable(Connection conexion, String responsable, String estudiante){
        CallableStatement procedimiento = null;
        try{
            procedimiento = conexion.prepareCall("CALL insertarRelacionEstudianteResponsable" + UtilidadesCapaDatos.agregarParametros(2),
                ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            procedimiento.setString(Responsable.cedulaNC+"_p", responsable);
            procedimiento.setString(Responsable.cedulaEstudianteNC+"_p", estudiante);
        }catch(SQLException sqlException){
            sqlException.printStackTrace();
        }
        return procedimiento;
    }//fin de spInsertarResponsable

    private CallableStatement spModificarResponsable(Connection conexion, Responsable responsable){
        CallableStatement procedimiento = null;
        try{
            procedimiento = conexion.prepareCall("CALL modificarResponsable" + UtilidadesCapaDatos.agregarParametros(12),
                ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            procedimiento.setString(Responsable.cedulaNC+"_p", responsable.getCedula());
            procedimiento.setString(Responsable.nombreNC+"_p", responsable.getNombre());
            procedimiento.setString(Responsable.apellidosNC+"_p", responsable.getApellidos());
            procedimiento.setDate(Responsable.fechaNacNC+"_p", responsable.getFechaNac());
            procedimiento.setString(Responsable.telefono1NC+"_p", responsable.getTelefono1());
            procedimiento.setString(Responsable.telefono2NC+"_p", responsable.getTelefono2());
            procedimiento.setString(Responsable.sexoNC+"_p", responsable.getSexo());
            procedimiento.setString(Responsable.nacionalidadNC+"_p", responsable.getNacionalidad());
            procedimiento.setString(Responsable.provinciaNC+"_p", responsable.getProvincia());
            procedimiento.setString(Responsable.cantonNC+"_p", responsable.getCanton());
            procedimiento.setString(Responsable.distritoNC+"_p", responsable.getDistrito());
            procedimiento.setString(Responsable.otrasSeniasNC+"_p", responsable.getOtrasSenias());
        }catch(SQLException sqlException){
            sqlException.printStackTrace();
        }
        return procedimiento;
    }//fin de spModificarResponsable
    
    private CallableStatement spEliminarResponsable(Connection conexion, String cedula){
        CallableStatement procedimiento = null;
        try{
            procedimiento = conexion.prepareCall("CALL eliminarResponsable" + UtilidadesCapaDatos.agregarParametros(1),
                ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            procedimiento.setString(Responsable.cedulaNC+"_p", cedula);
        }catch(SQLException sqlException){
            sqlException.printStackTrace();
        }
        return procedimiento;
    }//fin de spEliminarResponsable
    
    private Responsable crearResponsable(ResultSet resultSet) throws SQLException{
        Responsable responsable = new Responsable();
        responsable.setCedula(resultSet.getString(Responsable.cedulaNC));
        responsable.setNombre(resultSet.getString(Responsable.nombreNC));
        responsable.setApellidos(resultSet.getString(Responsable.apellidosNC));
        responsable.setFechaNac(resultSet.getDate(Responsable.fechaNacNC));
        responsable.setTelefono1(resultSet.getString(Responsable.telefono1NC));
        responsable.setTelefono2(resultSet.getString(Responsable.telefono2NC));
        responsable.setSexo(resultSet.getString(Responsable.sexoNC));
        responsable.setNacionalidad(resultSet.getString(Responsable.nacionalidadNC));
        responsable.setProvincia(resultSet.getString(Responsable.provinciaNC));
        responsable.setCanton(resultSet.getString(Responsable.cantonNC));
        responsable.setDistrito((resultSet.getString(Responsable.distritoNC)));
        responsable.setOtrasSenias(resultSet.getString(Responsable.otrasSeniasNC));
        return responsable;
    }//fin de crearResponsable

    private Responsable crearResponsableLight(ResultSet resultSet) throws SQLException{
        Responsable responsable = new Responsable();
        responsable.setCedula(resultSet.getString(Responsable.cedulaNC));
        responsable.setNombre(resultSet.getString(Responsable.nombreNC));
        responsable.setApellidos(resultSet.getString(Responsable.apellidosNC));
        return responsable;
    }//fin de crearResponsable

}//fin de la clase ControladoraBDResponsable
